

/**
 * @ClassName Offer28
 * @Description 剑指 Offer 28. 对称的二叉树
 * @Author clockTown
 * @Date 2021/8/18 10:27
 * @Version 1.0
 */
class Offer28 {
}

class Offer28V0 {
    public boolean isSymmetric(TreeNode root) {
        // 对比根节点左右子树是否成镜像
        return root == null || recur(root.left, root.right);
    }

    private boolean recur(TreeNode A, TreeNode B) {
        //A、B 节点均为 null 时说明相同
        if(B == null && A == null) {
            return true;
        }
        // A、 B 节点值不同就返回 false
        if(A == null || B == null || A.val != B.val) {
            return false;
        }
        // 递归对比 左节点的左子树和右节点的右子树是否相同、左节点的右子树和右节点的左子树是否相同
        return recur(A.left, B.right) && recur(A.right, B.left);
    }

}